 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Blackjack;

import java.util.List;
import java.util.ArrayList;
/**
 *
 * @author Michal
 */
public class DriverPartida {

    private VentPartida VP;
    private DriverSesion DS;
    private DriverDomainSesion DDS;
    private int fase; // 0 para apostar, 1 para seguro, 2 para jugar
    private int njug; // numero de jugadores activos
    private int i; // contador para ver a que jugador le toca
    private List jugadas; //numero de jugadas que tiene cada jugador
    private int j; // jugada que esta jugando el jugador actual

    public DriverPartida(DriverSesion ds, VentPartida vp, DriverDomainSesion dds, int numjug) {
        DS = ds;
        VP = vp;
        DDS = dds;
        njug = numjug;
        jugadas = new ArrayList(); // No sé si de la otra manera funciona, pero así seguro Michal
    }

    public void jugar() {
        if (fase == 0) {
            if (i < njug) {
                int apuesta;
                if (DDS.esMaquina(i)) {
                    apuesta = DDS.apostarMaquina(i); // esto ya hace la apuesta en DDS
                    VP.apostar(i, apuesta);
                    i++;
                    jugar();
                }
                else {
                    VP.seleccionarJug(i, 0);
                    VP.pedir(DDS.getInformacion(), i, j); //esto es solo para actualizar la pantalla
                    VP.mostrarOpApuesta(i); // Muestra al jugador i las opciones de apostar o abandonar la sesion
                    VP.setEnabled(true);
                }
            }
            else {
                List Cartas = DDS.iniciarJuegoCoupier();
                Cartas = DDS.getInformacion();
                VP.NuevaJugadaCroupier(Cartas); // Aunque la lista solo tenga una carta, hay que mostrar dos, una boca abajo
                VP.evalCroupier(DDS.getEvaluarCroupier(0));
                for (i = 0; i < njug; i++) {
                    Cartas = DDS.iniciarJuego(i);
                    Cartas = DDS.getInformacion();
                    VP.NuevaJugada(i, Cartas);
                }
                fase = 1;
                i = 0;
                jugar();
            }
        }
        else if (fase == 1) {
            if (DDS.tieneAsCroupier() && i < njug) {
                if (DDS.esMaquina(i)) {
                    int seguro = DDS.apostarSeguroMaquina(i);
                    VP.apostarSeguro(i, seguro);
                    i++;
                    jugar();
                }
                else {
                    VP.seleccionarJug(i, 0);
                    VP.pedir(DDS.getInformacion(), i, j); //esto es solo para actualizar la pantalla
                    VP.mostrarOpSeguro();
                    VP.setEnabled(true);
                }
            }
            else {
                if (DDS.blackjackCroupier()) {
                    DDS.mostrarCartaCroupier();
                    VP.estadoCr(4);
                    VP.mostrarCartaCroupier(DDS.getInformacion());
                    VP.evalCroupier(DDS.getEvaluarCroupier(1));
                    for (i = 0; i < njug; i++) {
                        if (DDS.tieneAsCroupier()) {
                            DDS.ganarSeguro(i);
                            VP.ganarSeguro(i);
                        }
                        if (DDS.haGanado(i, 0) == 0) {
                            VP.empate(i, 0);
                        }
                        else {
                            VP.perder(i, 0);
                            // En los casos de perder, solo se debe retirar la
                            // representacion de la apuesta, no se debe restar
                            // nada al dinero del jugador, esto se debe hacer al apostar
                        }
                    }
                    VP.seleccionarJug(-1, -1);
                    VP.deseleccionar();
                    VP.pedir(DDS.getInformacion(), i, j); //esto es solo para actualizar la pantalla
                    VP.mostrarOpContinuar();
                    VP.setEnabled(true);
                }
                else  {
                    if (DDS.tieneAsCroupier()) {
                        for (i = 0; i < njug; i++) VP.perderSeguro();
                    }
                    i = 0;
                    fase = 2;
                    jugar();
                }
            }
        }
        else {
            if (i < njug) {
                if (DDS.blackjack(i)) {
                    VP.ganarBlackjack(i, 0);
                    jugadas.add(-1);
                    i++;
                    jugar();
                }
                else {
                    jugadas.add(1);
                    j = 0;
                    jugarJugador();
                }
            }
            else {
                DDS.mostrarCartaCroupier();
                List l = DDS.getInformacion();
                VP.mostrarCartaCroupier(l);
                jugarCroupier();
                VP.evalCroupier(DDS.getEvaluarCroupier(1));
                int res;
                for (i = 0; i < njug; i++) {
                    int jug = (Integer)jugadas.get(i);
                    for (j = 0; j < jug; j++) {
                        res = DDS.haGanado(i, j);
                        if (res == 1) {
                            VP.ganar(i, j);
                        }
                        else if (res == 0) {
                            VP.empate(i, j);
                        }
                        else {
                            VP.perder(i, j);
                        }
                    }
                }
                VP.deseleccionar();
                VP.seleccionarJug(-1, -1);
                VP.pedir(DDS.getInformacion(), i, j); //esto es solo para actualizar la pantalla
                VP.mostrarOpContinuar();
                VP.setEnabled(true);
            }
        }
    }

    public void retirar() {
        VP.setEnabled(false);
        VP.quitarOpApostar(i);
        DDS.retirar(i);
        VP.retirar(i);
        --njug;
        if (njug == 0) DS.acabar();
        else jugar();
    }

    public void apostar(int apuesta) {
        VP.quitarOpApostar(i);
        if (DDS.apostar(i, apuesta)) {
            VP.setEnabled(false);
            VP.apostar(i, apuesta);
            VP.seleccionarJug(-1, -1);
            VP.pedir(DDS.getInformacion(), i, j); //esto es solo para actualizar la pantalla
            i++;
            jugar();
        }
        else {
            VP.apuestaImposible();
            VP.mostrarOpApuesta(i);
            VP.setEnabled(true);
        }
    }

    public void seguro(int seguro) {
        VP.quitarOpSeguro();
        if (DDS.apostarSeguro(i, seguro)) {
            VP.setEnabled(false);
            VP.seleccionarJug(-1, -1);
            VP.pedir(DDS.getInformacion(), i, j); //esto es solo para actualizar la pantalla
            VP.apostarSeguro(i, seguro);
            i++;
            jugar();
        }
        else {
            VP.apuestaImposible();
            VP.mostrarOpSeguro();
            VP.setEnabled(true);
        }
    }

    public void jugarJugador() {
        if (j < (Integer)jugadas.get(i)) {
            if (DDS.manoPasada(i, j)) {
                //VP.deseleccionarJugada(i, j); //opcionalmente, si se resalta de alguna manera la jugada actual
                if (DDS.getEvaluar(i, j) > 21) VP.estadoJug(i, j, 2);
                j++;
                jugarJugador();
            }
            else {
                VP.seleccionar(i, j, DDS.getEvaluar(i, j));
                VP.seleccionarJug(i, j);
                VP.pedir(DDS.getInformacion(), i, j); //esto es solo para actualizar la pantalla
                if (DDS.esMaquina(i)) {
                    List r = DDS.accionMaquina(i);
                    List l = DDS.getInformacion();
                    int id = (Integer)r.remove(0);
                    if (id == 0) {
                        //VP.seleccionarJug(-1, -1);
                        j++;
                    }
                    else if (id == 1) {
                        VP.pedir(r, i, j);
                    }
                    else if (id == 2) {
                        VP.dividir(l, i, j, DDS.getJugadaUltima(i));
                        int t = (Integer)jugadas.get(i);
                        t++;
                        jugadas.remove(i);
                        jugadas.add(i, t);
                    }
                    else if (id == 3) {
                        VP.doblar(l, i, j);
                        j++;
                    }
                    l = DDS.getInformacion();
                    VP.pedir(l, i, j); //esto actualiza las cartas aunque ponga pedir xD
                    jugarJugador();
                }
                else {
                    VP.mostrarOpAccion();
                    if (DDS.puedeDividir(i)) {
                        VP.mostrarOpDividir(i, j);
                    }
                    if (DDS.puedeDoblar(i)) {
                        VP.mostrarOpDoblar(i, j);
                    }
                    VP.setEnabled(true);
                }
            }
        }
        else {
            i++;
            jugar();
        }
    }

    public void pasar() {
        VP.setEnabled(false);
        VP.ocultarOpAccion(); // Desactiva todos los botones de accion
        DDS.pasar(i);
        //VP.deseleccionarJugada(i, j);
        j++;
        jugarJugador();
    }

    public void pedir() {
        VP.setEnabled(false);
        VP.ocultarOpAccion(); // Desactiva todos los botones de accion
        List l = DDS.pedir(i);
        l = DDS.getInformacion();
        VP.pedir(l, i, j);
        jugarJugador();
    }

    public void dividir() {
        VP.setEnabled(false);
        VP.ocultarOpAccion(); // Desactiva todos los botones de accion
        List l = DDS.dividir(i);
        l = DDS.getInformacion();
        VP.dividir(l, i, j, DDS.getJugadaUltima(i));
        int t = (Integer)jugadas.get(i);
        t++;
        jugadas.remove(i);
        jugadas.add(i, t);
        jugarJugador();
    }
    
    public void doblar() {
        VP.setEnabled(false);
        VP.ocultarOpAccion(); // Desactiva todos los botones de accion
        List l = DDS.doblar(i);
        l = DDS.getInformacion();
        VP.doblar(l, i, j);
        j++;
        jugarJugador();
    }

    public void jugarCroupier() {
        if (!DDS.haTerminadoCroupier()) {
            DDS.jugadaCroupier();
            VP.pedirCroupier(DDS.getInformacion());
            jugarCroupier();
        }
    }

    public void nuevaPartida() {
        fase = 0;
        i = 0;
        VP.setEnabled(true);
        jugar();
    }

    public void continuarPartida() {
        VP.desactivarGuardar();
        VP.setEnabled(false);
        jugar();
    }



    public void finPartida() {
        VP.setEnabled(false);
        VP.ocultarOpContinuar();
        jugadas.clear();
        VP.limpiar();
        for (i = 0; i < njug; i++) {
            if (DDS.haPerdido(i)) {
                VP.retirar(i);
                njug--;
                --i;
            }
        }
        DDS.finPartida();
        DS.jugar();
    }
}
